﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SISLOG.BusinessEntities;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.Unity;
using System.Data.Common;

namespace SISLOG.DataAccess
{
    public class MaterialDAO:MasterDAEL, IMaterialDAO
    {        
        [Dependency]
        public IProveedorDAO ProveedorDAO { get; set; }
        List<Proveedor> listProveedores;

        public List<Material> GetAllFromMaterial()
        {
            var materiales = dbSisLog.ExecuteSprocAccessor<Material>("GetAllFromMaterial", RowMaperMaterial());
            return materiales.ToList();            
        }

        private IRowMapper<Material> RowMaperMaterial()
        {
            IRowMapper<Material> rowMapper = MapBuilder<Material>.MapAllProperties()
                .Map(m => m.Proveedor).WithFunc(p => ProveedorDAO.GetAllFromProveedorByIdProveedor(p.GetInt32(p.GetOrdinal("idProveedor"))))
                .Build();

            return rowMapper;
        }

        private Proveedor GetProveedorById(Int32 idProveedor)
        {
            var query = from p in listProveedores
                        where p.idProveedor == idProveedor
                        select p;

            return query.SingleOrDefault();
        }
   
        public List<Material> GetAllFromMaterialByCriterio(string criterio)
        {
            var materiales = dbSisLog.ExecuteSprocAccessor<Material>("GetAllFromMaterialByCriterio",RowMaperMaterial() , criterio);
            return materiales.ToList(); 
        }

        public void RegistrarMaterial(Material material)
        {
            DbCommand comando = dbSisLog.GetStoredProcCommand("RegistrarMaterial");
            dbSisLog.AddInParameter(comando, "idMaterial", System.Data.DbType.Int32, material.idMaterial);
            dbSisLog.AddInParameter(comando, "descripcion", System.Data.DbType.String, material.descripcion);
            dbSisLog.AddInParameter(comando, "idProveedor", System.Data.DbType.Int32, material.idProveedor);
            dbSisLog.AddInParameter(comando, "fechaIngreso", System.Data.DbType.DateTime, material.fechaIngreso);
            dbSisLog.AddInParameter(comando, "stockInicial", System.Data.DbType.Int32, material.stockInicial);
            dbSisLog.AddInParameter(comando, "stockFinal", System.Data.DbType.Int32, material.stockFinal);
            dbSisLog.AddInParameter(comando, "puntoReorden", System.Data.DbType.Int32, material.puntoReorden);

            dbSisLog.ExecuteNonQuery(comando);
        }

        public Material GetAllFromMaterialByIdMaterial(int idMaterial)
        {
            listProveedores = ProveedorDAO.GetAllFromProveedor();

            var materiales = dbSisLog.ExecuteSprocAccessor<Material>("GetAllFromMaterialByIdMaterial", RowMaperMaterial() ,idMaterial);
            return materiales.SingleOrDefault();
        }
        
        public List<Material> GetAllFromMaterialByProveedor(string nombreEmpresa)
        {
            listProveedores = ProveedorDAO.GetAllFromProveedor();

            var materiales = dbSisLog.ExecuteSprocAccessor<Material>("GetAllFromMaterialByProveedor", RowMaperMaterial(), nombreEmpresa);
            return materiales.ToList();
        }
    }
}